import $C from './config.js';
import $U from '@/common/free-lib/util.js';
import $store from '@/store/index.js';
export default {
	// 全局配置
	common: {
		baseUrl: $C.baseUrl,
		header: {
			'Content-Type': 'application/json;charset=UTF-8',
		},
		data:{},
		method: 'GET',
		dataType: 'json',
		token: true
	},
	// 请求 返回promise
	request(options = {}){
		options.url = this.common.baseUrl + options.url
		options.header = options.header || this.common.header
		options.data = options.data || this.common.data
		options.method = options.method || this.common.method
		options.dataType = options.dataType || this.common.dataType
		options.token = options.token === false ? false : this.common.token
		
		if(options.token){
			let token = $U.getStorage('token')
			if(!token) {
				uni.showToast({
					title: '请先登录',
					icon: 'none'
				});
				return uni.reLaunch({
					url: '/pages/common/login/login'
				});
			}
			
			// 往 header 头中添加token
			options.header.token = token
		}
		
		// 请求
		return new Promise((res, rej)=>{
			uni.request({
				...options,
				success:(result)=>{
					// 返回原始数据
					if(options.native){
						return res(result)
					}
					// 服务端失败
					if(result.statusCode !== 200){
						if(options.toast !== false){
							uni.showToast({
								title: result.data.data || '服务端失败',
								icon: 'none'
							});
						}
						// token不合法自动退出  token 不合法
						if(result.data.data === 'token 不合法'){
							$store.dispatch('logout')
						}
						
						return rej(result.data)
					}
					// 成功
					let data = result.data.data
					res(data)
				},
				fail: (error) => {
					uni.showToast({
						title: "服务端请求失败，请稍后再试" || '请求失败',
						icon: 'none'
					});
					return rej(error)
				}
			});
		})
	},
	
	// get 请求
	get(url, data = {}, options = {}){
		options.url = url
		options.data = data
		options.method = 'GET'
		return this.request(options)
	},
	
	// post 请求
	post(url, data = {}, options ={}){
		options.url = url
		options.data = data
		options.method = 'POST'
		return this.request(options)
	},
	
	// 上传文件(onProgress监听上传进度)
	upload(url, data, onProgress = false){
		return new Promise((result, reject)=>{
			// 上传
			let token = $U.getStorage('token')
			if(!token) {
				uni.showToast({
					title: '请先登录',
					icon: 'none'
				});
				return uni.reLaunch({
					url: '/pages/common/login/login'
				});
			}
			
			const uploadTask = uni.uploadFile({
				url: this.common.baseUrl + url,
				filePath: data.filePath,
				name: data.name || 'files',
				header:{ token },
				success: (res) => {
					if(res.statusCode !== 200){
						reject(false)
						return uni.showToast({
							title: '上传失败',
							icon: 'none'
						});
					}
					let message = JSON.parse(res.data)
					result(message.data)
				},
				fail: (err) => {
					reject(err)
				}
			})
			// 监听上传
			uploadTask.onProgressUpdate(res=>{
				if(typeof onProgress === 'function'){
					onProgress(res.progress)
				}
			})
		})
	}
}